package common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;



/**
* @Author: nxs@winning.com.cn
* 
* @Description:  时间处理工具类
* 
* @Date: 2018-08-03 08:50:52 
*
*
 **/ 
public class DateUtil {

    /**
     *@描述 根据时间格式获取到当前日期和时间
     *@参数   yyyy-MM-ddHH:mm:ss
     *@返回值
     *@创建人  wujiaxing
     *@创建时间  2019/6/24
     */
    public static String getNowTime(String format){
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        String dateTime = sdf.format(now);
        return dateTime;
    }

    /**
     * 获得当前时间，格式 yyyy-MM-dd HH:mm:ss
     * return String
     */
    public static String getCurrentDate() {
        return getCurrentDate("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获得当前时间，格式 yyyy-MM-dd
     * @return
     */
    public static String getCurrentDate2() {
        return getCurrentDate("yyyy-MM-dd");
    }


    /**
     * 获得当前时间，格式 yyyy-MM-dd HH:mm:ss
     * return Date
     *
     */
    public static Date getDate() {

        Date now = new Date();
        SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            now = dtf.parse(dtf.format(System.currentTimeMillis()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return now;
    }

    /**
     * 获得当前时间，格式自定义
     *
     */
    public static String getCurrentDate(String format) {
        Calendar day = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(day.getTime());
    }

    /**
     * 获得昨天时间，格式自定义
     * 
     * @params format
     * @return String
     */
    public static String getYesterdayDate(String format) {
        Calendar day = Calendar.getInstance();
        day.add(Calendar.DATE, -1);
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return  getAfterDate( format,-1);
    }
    /**
    * @vsts_no：
    * @comment： 获取n天以前的数据
    * @author： caopengfei
    * @time：  2019/8/28 16:04
    */
    public static String getAfterDate(String format,int n) {
        Calendar day = Calendar.getInstance();
        day.add(Calendar.DATE, n);
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(day.getTime());
    }

    /**
     * 获取每个月的第一天时间
     * 
     * @params year
     * @params month
     * @return String
     */
    public static String getFirstDayOfMonth(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(year, month, 1, 0, 0, 0);
        c.add(Calendar.MONTH, -1);
        c.set(Calendar.DAY_OF_MONTH, c.getMinimum(Calendar.DAY_OF_MONTH));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(c.getTime());
    }

    /**
     * 获取每个月的最后一天时间
     * 
     * @params year
     * @params month
     * @return String
     */
    public static String getLastDayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR,year);
        //设置月份
        cal.set(Calendar.MONTH, month-1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(cal.getTime());
    }


    /**
     * 根据给定日期输出指定格式的日期字符串
     * 
     * @params date
     * @params format
     * @return String
     * @see
     * @since
     */
    public static String formatData(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 按照时间字符串和格式转换成Date类
     * 
     * @params date
     * @params format
     * @return Date
     * @throws ParseException
     * @see
     * @since
     */
    public static Date getDate(String date, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.parse(date);
    }


    /**
     * 判断两个时间是否跨月
     *
     * @params startTime
     * @params endTime
     * @return boolean
     */
    public static boolean isCrossMonth(String startTime, String endTime){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try
        {
            // 格式化开始日期和结束日期
            Calendar objCalendarDate1 = Calendar.getInstance();
            objCalendarDate1.setTime(sdf.parse(startTime));

            Calendar objCalendarDate2 = Calendar.getInstance();
            objCalendarDate2.setTime(sdf.parse(endTime));

            // 开始时间结束时间大小比较
            long start = objCalendarDate1.getTimeInMillis();
            long end = objCalendarDate2.getTimeInMillis();
            if(start-end>0){
                return true;
            }

            int startYear = objCalendarDate1.get(Calendar.YEAR);
            int endYear = objCalendarDate2.get(Calendar.YEAR);

            // 判断是否跨年
            if(startYear-endYear!=0){
                return true;
            }
            // 判断是否跨月
            int startMonth = objCalendarDate1.get(Calendar.MONTH);
            int endMonth = objCalendarDate2.get(Calendar.MONTH);
            if(startMonth-endMonth!=0){
                return true;
            }

        } catch (ParseException e) {
            e.printStackTrace();
            return true;
         }

        return false;
    }
    // ----------------------------------------------------------------------

    /**
     * 根据输入的日期字符串 和 提前天数 ，
     * 获得 指定日期提前几天的日期对象
     * @param format 格式 如 yyyy-MM-dd
     * @param beforeDays 指定天数
     * @return 指定日期倒推指定天数后的日期
     */
    public static String getBeforeDaysDate(String format , int beforeDays) {
        Calendar day = Calendar.getInstance();
        day.add(Calendar.DATE, beforeDays);
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(day.getTime());
    }

    /**
     * 根据输入的日期字符串 、日期、后推天数 ，
     * 获得 指定日期字符串
     * @param format 格式 如 yyyy-MM-dd
     * @param date 日期
     * @param beforeDays 指定天数
     * @return 指定日期倒推指定天数后的日期
     */
    public static String getAfterDaysDate(String format ,Date  date ,int beforeDays) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.DATE, beforeDays);
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取指定年月的 第n周 的周一
     *
     * @param year      年份
     * @param month     月份
     * @param weekOrder 第几周
     * @return
     */
    public static String getMondayOfMonth(int year, int month, int weekOrder) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1); //从0开始

        int day = 1;
        cal.set(Calendar.DAY_OF_MONTH, day);    //从第一天开始找第一个星期一
        while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
            cal.set(Calendar.DAY_OF_MONTH, ++day);
        }

        cal.add(Calendar.DAY_OF_MONTH, (weekOrder - 1) * 7);

        return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
    }

    /**
     * 获取n天以前的数据
     *
     * @param dateStr
     * @param format
     * @param n
     * @return
     */
    public static String getDateAfterDays(String dateStr, String format, int n) {
        Calendar day = Calendar.getInstance();
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            day.setTime(sdf.parse(dateStr));

        } catch (Exception e) {
            e.printStackTrace();
        }
        day.add(Calendar.DATE, n);
        return new SimpleDateFormat(format).format(day.getTime());
    }


    public static void main(String[] args) {
       /* String tt = getMondayOfMonth(2021, 01, 1);
        System.out.println(tt);
        String nn = getDateAfterDays(tt, "yyyy-MM-dd", 6);
        System.out.println(nn);

        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        System.out.println(year);*/

        String dateAfterDays = getDateAfterDays("2022-02-24", "yyyy-MM-dd", -1);
        System.out.println(dateAfterDays);
    }

    public static String getBeforeMonthDate(String format, int beforeMonth) {
        Calendar day = Calendar.getInstance();
        day.add(Calendar.MONTH, beforeMonth);
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(day.getTime());
    }

}
